/**
 * 错误的统一处理
 * err：得到的错误。可以是自定义字符串，也可以是Error对象或者普通请求返回的错误信息
 * config：请求配置，用于输出错误信息
 * reject：请求的reject函数
 * again：该请求如果失败，则重试的操作。在errType = 'modal'时存在就会有重试按钮
 */
module.exports  = (err, config, reject, again) => {
	const {
		showConsole = true, // 是否输出错误信息。一定要输出，该参数无效
		name = '请传入请求说明或者链接', // 当前请求的名称
		getErrStr, // 获取错误提示的方法
		errType = process.env.NODE_ENV === 'development' ? 'modal' : 'toast', // 错误类型，toast：提示框，modal：对话框，有重试按钮。在开发状态下默认是modal，生产环境默认是toast
	} = config || {}
	var errorString = '请求失败', isExpired = false
	if (typeof(err) === 'string') {
		errorString = err
	} else if (err) {
		// 错误信息一定要输出
		console.error(err)
		if (err.message || err.errMsg) {
			errorString = err.message || err.errMsg
		}
		if (err.code === 401) { // 一般是登录已过期。需要重新登录
			isExpired = true
		}
		// 其它标识登录已过期的判断
	}
	console.error(`${errorString}：${name}`)
	if (isExpired) {
		return getApp().dispatch('handleLoginExpired', err)
	}
	if (getErrStr) {
		getErrStr(errorString)
	} else {
		if (errType === 'toast') {
			uni.showToast({
				title: errorString,
				icon: 'none'
			})
		} else if (errType === 'modal') {
			uni.showModal({
				title: '请求失败',
				content: errorString,
				showCancel: !!again,
				confirmText: again ? '重试' : '我知道了',
				success: (res) => {
					if (res.confirm) {
						again && again()
					}
				}
			})
		}
	}
	reject(err)
}